/**
 * Create in 2012-4-17.
 */
package kit4j.common.task;

/**
 * 分步任务类型。
 * 
 * @author MiniKnife
 * 
 */
public class StepTask extends AbstractProgressionalTask {

	/**
	 * 分步任务回调接口。
	 * 
	 * @author MiniKnife
	 * 
	 */
	public static interface StepTaskCallback {

		/**
		 * 执行一步操作。
		 */
		public void execute();

		/**
		 * @return 任务长度
		 * @see kit4j.common.task.ProgressionalTask#getTaskLength()
		 */
		public long getTaskLength();

		/**
		 * @return 当前任务进度
		 * @see kit4j.common.task.ProgressionalTask#getCurrentTaskProgressRate()
		 */
		public long getCurrentTaskProgressRate();
	}

	/**
	 * 分步回调对象。
	 */
	private StepTaskCallback stepTaskCallback;

	/**
	 * 状态持有对象。
	 */
	protected Object stateHolder;

	/**
	 * 创建一个分步任务。
	 * 
	 * @param stepTaskCallback
	 *            完成具体分步行为的回调对象
	 */
	public StepTask(StepTaskCallback stepTaskCallback) {
		this.stepTaskCallback = stepTaskCallback;
		stateHolder = new Object();
	}

	/**
	 * @see kit4j.common.task.Task#getDescription()
	 */
	@Override
	public String getDescription() {
		return null;
	}

	/**
	 * @see kit4j.common.task.AbstractProgressionalTask#doStart()
	 */
	@Override
	protected void doStart() {
		while (getCurrentTaskProgressRate() < getTaskLength()) {
			if (TaskState.PAUSE.equals(getTaskState())) {
				try {
					stateHolder.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} else if (TaskState.STOP.equals(getTaskState())) {
				return;
			} else {
				callback();
			}
		}
	}
	
	/**
	 * 回调执行任务。
	 */
	protected void callback() {
		stepTaskCallback.execute();
	}

	/**
	 * @see kit4j.common.task.ProgressionalTask#getCurrentTaskProgressRate()
	 */
	@Override
	public long getCurrentTaskProgressRate() {
		return stepTaskCallback.getCurrentTaskProgressRate();
	}

	/**
	 * @see kit4j.common.task.ProgressionalTask#getTaskLength()
	 */
	@Override
	public long getTaskLength() {
		return stepTaskCallback.getTaskLength();
	}

	/**
	 * @see kit4j.common.task.AbstractProgressionalTask#doPause()
	 */
	@Override
	protected void doPause() {
	}

	/**
	 * @see kit4j.common.task.AbstractProgressionalTask#doResume()
	 */
	@Override
	protected void doResume() {
		stateHolder.notifyAll();
	}

	/**
	 * @see kit4j.common.task.AbstractProgressionalTask#doStop()
	 */
	@Override
	protected void doStop() {
	}

	/**
	 * @return the stepTaskCallback
	 */
	public StepTaskCallback getStepTaskCallback() {
		return stepTaskCallback;
	}

}
